#pragma once

#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <fcntl.h>
#include"../common/log.hpp"
#include"../common/util.hpp"
class Compile_Modle {
    public:

        //编译目标文件
        static bool Compile(const std::string &filename)
        {
            pid_t pid = fork();
            if(pid == 0){//子进程

                umask(0);//关闭文件创建掩码
                //打开创建保存错误信息的文件（将标准错误信息重定向到该文件文件）
                int fd  = open(Util_File::ExtCompError(filename).c_str() , O_CREAT | O_WRONLY ,0644);
                if(fd == -1){
                    LOG__ERR("open file error");
                    exit(1);
                }
                int ret = dup2(fd,2);//将标准错误重定向到文件
                if(ret == -1){
                    LOG__ERR("dup2 error");
                    exit(1);
                }
                std::string srcfile = Util_File::ExtensionSrc(filename);
                std::string objfile = Util_File::ExtensionObj(filename);
                execlp("g++", "g++",srcfile.c_str(), "-o" , objfile.c_str() ,"-D", "COMPILE_CODE" ,  "-std=c++11", nullptr);//执行编译命令程序,然后程序替换
                exit(1);
            }else if(pid > 0){//父进程
                
                int ret = waitpid(pid, nullptr, 0);//等待子进程结束(阻塞)
                
                if(ret == -1){
                    LOG__ERR("waitpid error");
                }
                
                if(Util_File::IsFileExist(Util_File::ExtensionObj(filename))){
                    LOG__INF("编译成功");
                    return true;
                }
                else{
                    LOG__INF("编译失败");
                    return false;
                }

            }else{//fork失败
                LOG__ERR("fork error");
                return false;
            }
            LOG__ERR("出乎意料的错误");
            return false;
        }
};